contextualiza la idea del seminario, entrega una idea general de la temática, de lo que se sabe y sobre todo de lo que no se sabe y queréis abordar en vuestro trabajo.
El suicidio es un fenómeno ocmplejo que constituye un importante problema de salud pública en España y en el mundo. Aunque se dispone de información general sobre la mortalidad por suicidio, la evidencia científica revela diferencias significativas según el sexo, la edad y el territorio.
En este seminario, nos proponemos comparar el suicidio utilizando distintos conjuntos de datos (sexo, edad y territorio) para explorar las diferencias y analizar a que se deben.
Describir la distribución del suicidio por sexo en España.
Analizar las diferencias entre provincias.
Estudiar la influencia del grupo de edad en la cantidad de suicidios.
Unificar los datos CSV y JSON para obtener una vista más completa.
(Opcional) Explorar si existe relación entre grupos de edad + provincias + sexo.
Para poder utilizar nuestros conjuntos de datos es necesario importar las siguientes librerias y paquetes:
# Datos con formato .csv:
library(readr)
#Datos con formato .json:
library(tidyverse)
library(rjson)
library(jsonlite)
library(tidyjson)
#Visualizacion resultados:
library(DT)
library(ggplot2)
library(gifski)
library(gganimate)
library(plotly)
library(dplyr)
library(mapSpain)
Una vez cargadas las librerias importamos los datos
Para este trabajo se han utilizado dos conjuntos de datos procedentes del Instituto Nacional de Estadísitca (INE), a través de sus estadísticas oficiales sobre defunciones según causa de muerte. Ambas fuentes se han descargado directamente desde la herramienta de consulta del INE y contienen información actualizada y validada por el organismo.
En resumen, el CSV ofrece tasas por provincia, sexo y año, mientras que el JSON proporciona números absolutos por edad y sexo a nivel nacional. Esta combinación permite un análisis estadístico completo tanto a nivel territorial como demográfico.
En algunos de nuestros archivos csv, es necesario especificar el tipo de codificación que tienen, para que R pueda leer correctamente los caracteres especiales como tildes o ñ. En nuestro caso utilizan la codificacion ISO 8859-1 que corresponde con el alfabeto español??? :
# Para conocer el tipo de codificación:
encoding <- guess_encoding("INPUT/DATA/provincias_sexo.csv")
print(encoding)
## # A tibble: 4 × 2
## encoding confidence
## <chr> <dbl>
## 1 UTF-8 1
## 2 Shift_JIS 1
## 3 windows-1252 0.45
## 4 windows-1250 0.21
provincias <- read_delim("INPUT/DATA/provincias_sexo.csv",
delim = ";", trim_ws = TRUE,
locale = locale(encoding = "ISO-8859-1"))
head(provincias)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 Nacional Total 2023 8512
## 2 Nacional Total 2022 8846
## 3 Nacional Total 2021 845
## 4 Nacional Hombres 2023 12846
## 5 Nacional Hombres 2022 13343
## 6 Nacional Hombres 2021 12833
# Ruta al archivo JSON
ruta_json <- "INPUT/DATA/Suicidio_Edad-Sexo.json"
# Importar JSON y convertir a dataframe
suicidios_json <- fromJSON(ruta_json)
#suicidios_json <- as.data.frame(suicidios_json)
# Mostrar las primeras filas
head(suicidios_json)
## Nombre
## 1 Todas las edades, Ambos sexos
## 2 Todas las edades, Hombres
## 3 Todas las edades, Mujeres
## 4 Menores de 15 años, Ambos sexos
## 5 Menores de 15 años, Hombres
## 6 Menores de 15 años, Mujeres
## MetaData Data
## 1 edad, sexo, Todas las edades, Ambos sexos, todaslasedades, ambossexos 4227
## 2 edad, sexo, Todas las edades, Hombres, todaslasedades, hombres 3126
## 3 edad, sexo, Todas las edades, Mujeres, todaslasedades, mujeres 1101
## 4 edad, sexo, Menores de 15 años, Ambos sexos, menoresde15anos, ambossexos 12
## 5 edad, sexo, Menores de 15 años, Hombres, menoresde15anos, hombres 9
## 6 edad, sexo, Menores de 15 años, Mujeres, menoresde15anos, mujeres 3
Los datos han sido filtrados y preparados para asegurar la coherencia entre las fuentes. Se eliminaron los totales generales en sexo para poder comparar hombres y mujeres. Se normalizó el nombre de las provincias para ….noseq y se separó el json en edad, sexo y valor para noseqqq
# Crear el dataframe filtrado para el gráfico
# (Usa el dataframe 'provincias' que ya cargaste y mutaste)
Suicidios_CSV_filtrado <- provincias %>%
filter(Sexo != "Total",
Provincias != "Nacional")
# Ver el resultado (opcional)
head(Suicidios_CSV_filtrado)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 "01 Araba/Ã\u0081lava" Hombres 2023 10835
## 2 "01 Araba/Ã\u0081lava" Hombres 2022 13939
## 3 "01 Araba/Ã\u0081lava" Hombres 2021 10963
## 4 "01 Araba/Ã\u0081lava" Mujeres 2023 4086
## 5 "01 Araba/Ã\u0081lava" Mujeres 2022 4703
## 6 "01 Araba/Ã\u0081lava" Mujeres 2021 5323
Para así comparar hombres vs mujeres (entonces yo quitaría lo de cambiar el separador decimal xq si quitamos el total no nos hace falta camibar lo de . por , nose)
library(dplyr)
library(purrr)
library(tidyr)
# ===============================
# 1. Provincias: eliminar "Total" en Sexo
# ===============================
provincias_filtrado <- provincias %>%
filter(Sexo != "Total")
# Revisar resultado
head(provincias_filtrado)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 Nacional Hombres 2023 12846
## 2 Nacional Hombres 2022 13343
## 3 Nacional Hombres 2021 12833
## 4 Nacional Mujeres 2023 4348
## 5 Nacional Mujeres 2022 452
## 6 Nacional Mujeres 2021 423
Extraer: - Lista de edades - Lista de sexos - Valor
# Chunk CORREGIDO para: ### El JSON:separar edad y sexo
# (Asegúrate de tener 'library(tidyverse)' y 'library(jsonlite)' en tu chunk de paquetes)
# Este código usa un método más robusto para "aplanar" el JSON
# y evitar que se creen valores NA.
Suicidios_Edad <- as_tibble(suicidios_json) %>%
# 1. Extraer el 'Valor' de la sub-lista 'Data'
# (map_dbl toma cada elemento de 'Data' y extrae el primer 'Valor')
mutate(Valor = map_dbl(Data, ~ .x$Valor[1])) %>%
# 2. Guardar el 'Nombre' original (ej. "De 15 a 29 años, Hombres")
# como un ID único para agrupar las filas.
select(ID_Fila = Nombre, Valor, MetaData) %>%
# 3. Desanidar 'MetaData', que creará dos filas por cada ID_Fila
# (una para 'edad' y otra para 'sexo')
unnest(MetaData) %>%
# 4. Seleccionar solo las columnas que necesitamos para pivotar
select(ID_Fila, Valor, T3_Variable, Nombre) %>%
# 5. Pivotar usando el ID_Fila. Esto asegura que la 'edad' y el 'sexo'
# del mismo ID_Fila terminen en la misma fila, junto a su 'Valor'.
pivot_wider(names_from = T3_Variable, values_from = Nombre) %>%
# 6. Filtrar los totales (como antes)
filter(sexo != "Ambos sexos",
edad != "Todas las edades") %>%
# 7. (Opcional) Quitar la columna de ID, ya no la necesitamos
select(edad, sexo, Valor)
# Ver el resultado (opcional)
# Esta tabla ya no debería tener NAs en 'edad' o 'sexo'
print("Datos JSON (versión final) listos:")
## [1] "Datos JSON (versión final) listos:"
head(Suicidios_Edad)
## # A tibble: 6 × 3
## edad sexo Valor
## <chr> <chr> <dbl>
## 1 Menores de 15 años Hombres 9
## 2 Menores de 15 años Mujeres 3
## 3 De 15 a 29 años Hombres 224
## 4 De 15 a 29 años Mujeres 117
## 5 De 30 a 39 años Hombres 336
## 6 De 30 a 39 años Mujeres 100
Aquí vienen los gráficos
# Sumar los valores por sexo
suicidio_sexo_nacional <- Suicidios_Edad %>%
group_by(sexo) %>%
summarise(Total = sum(Valor, na.rm = TRUE))
# Revisar tabla
print(suicidio_sexo_nacional)
## # A tibble: 2 × 2
## sexo Total
## <chr> <dbl>
## 1 Hombres 3126
## 2 Mujeres 1101
# #GRAFICO DE BARRAS (suicidios por sexo a nivel nacional)
ggplot(suicidio_sexo_nacional, aes(x = sexo, y = Total, fill = sexo)) +
geom_bar(stat = "identity") +
labs(
title = "Suicidios por sexo a nivel nacional",
x = "Sexo",
y = "Número total de suicidios"
) +
scale_fill_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#ff7f0e")) +
theme_minimal()
# 1. Filtrar datos a nivel nacional (ya que JSON tiene solo sexo y edad, sumamos por sexo)
nacional_sexo <- Suicidios_Edad %>%
group_by(sexo) %>%
summarise(Total = sum(Valor))
#GRÁFICO CIRCULAR
ggplot(nacional_sexo, aes(x = "", y = Total, fill = sexo)) +
geom_bar(stat = "identity", width = 1) + # barra para convertir a circular
coord_polar(theta = "y") + # transforma a circular
labs(title = "Suicidios por sexo a nivel nacional") +
theme_minimal() +
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()) +
scale_fill_manual(values = c("Hombres" = "steelblue", "Mujeres" = "pink"))
INTERPRETACIÓN El gráfico de barras compara el total de suicidios entre hombres y mujeres, muestra que los hombreses presentan un mayor número de suicidios. El gráfico circular representa la misma información, pero en proporciones del total, muestra que los hombres representan aproximadamente el 75% de los suicidios a nivel nacional, mientras que las mujeres el 25%.
En conclusión, los análisis del total de suicidios según el sexo muestra una diferencia clara entre hombres y mujeres. En España, el número total de suicidios es significativamente mayor en hombres que en mujeres, lo cual coincide con las estadísitcas nacionales e internacionales, donde los hombres presentan tasas de suicidio más elevadas a pesar de que las mujeres registran más intentos no letales. Este patrón puede estar asociado a factores socioculturales, diferencias en métodos utilizados, menor búsqueda de ayuda por parte de los hombres o barreras sociales relaccionadas con la salud mental.
# Carga la librería plotly (si no está ya cargada)
library(plotly)
# 1. CREA el gráfico de ggplot (como antes, pero lo guardamos en una variable 'p')
# (Añado 'ncol=6' para que plotly tenga un layout inicial ordenado)
p <- ggplot(Suicidios_CSV_filtrado, aes(x = Sexo, y = Total, color = Sexo)) +
geom_point() +
facet_wrap(~Provincias, ncol = 6) + # 6 columnas de mini-gráficos
theme(
axis.text.x = element_text(angle = 0),
strip.text = element_text(size = 7)
)
# 2. CONVIÉRTELO en interactivo con un solo comando
# Ahora podrás hacer zoom y ver los detalles
ggplotly(p)
# Gráfico 4.4.3: Suicidio por edad (CORREGIDO)
# La corrección está en aes(fill = sexo) -> (todo en minúscula)
ggplot(Suicidios_Edad, aes(x = edad, y = Valor, fill = sexo)) +
geom_bar(stat = "identity", position = "dodge") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
Explicar lo que hemos obtenido del gráfico
CAMBIAR:
#PRIMERO FILTRAMOS SOLO LA FINLA "NACIONAL" DEL CSV Y ELIMINAMOS "TOTAL" EN SEXO:
# Filtrar nacional y sexo masculino/femenino en CSV
nacional_csv <- provincias %>%
filter(Provincias == "Nacional", Sexo != "Total") %>%
select(sexo = Sexo, Total) # renombramos columna Sexo a sexo
#AHORA, DEL JSON SUMAMOS LOS VALORES POR SEXO PARA TENER COMPARABLES
nacional_json <- Suicidios_Edad %>%
group_by(sexo) %>%
summarise(Total_JSON = sum(Valor, na.rm = TRUE))
#UNIMOS AMBOS DATASETS POR SEXO
nacional_comparativo <- nacional_csv %>%
left_join(nacional_json, by = "sexo") %>%
tidyr::pivot_longer(cols = c(Total, Total_JSON),
names_to = "Fuente",
values_to = "Valor")
Ahora nacional_comparativo tiene columnas: - sexo –> Hombres/Mujeres - Fuente –> CSV o JSON - valor –> número de suicidios
# GRAFICO COMPARATIVO (BARRAS LADO A LADO)
ggplot(nacional_comparativo, aes(x = sexo, y = Valor, fill = Fuente)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
labs(
title = "Comparación de suicidios por sexo a nivel nacional: CSV vs JSON",
x = "Sexo",
y = "Número total de suicidios"
) +
scale_fill_manual(values = c("Total" = "#1f77b4", "Total_JSON" = "#ff7f0e"),
labels = c("CSV", "JSON")) +
theme_minimal() +
theme(
text = element_text(size = 12),
axis.text.x = element_text(angle = 0, hjust = 0.5)
)
ME FALTA COMENTAR EL RESULTADO (poner foto a chati y q diga), VER SI CON
LOS DOS (CVS Y JSON) PUEDO HACER ALGUNA COMPARACIÓN MAS Y PONER EN EL
WORD LA EXPLICACIÓN DEL CODIGO.
…. Esto me lo dijo chat (puede ser para el 4.4 nose) –> Como ambos archivos (csv y json) comparten la varaible sexo, podemos unirlos por dicha variable
#REFERENCIAS